package com.hyou.springboot.util;

import java.io.Serializable;

import com.hyou.springboot.base.ResponseMessage;
import com.hyou.springboot.consts.CommonResponseCode;

/**
 * 构造Rest应答消息对象
 * 
 * @author FengChangshuo
 * @version 1.0.0 2018-03-27 16:21:17 初始创建
 */
public class ResponseMessageUtil {
    
    private ResponseMessageUtil() {
    }
    
    /**
     * <pre>
     * 构造执行成功的应答消息（不包含附加数据对象）
     * 消息格式：
     * 
     * {
     *     "code" : 0,
     *     "msg" : null,
     *     "data" : null
     * }
     * </pre>
     * 
     * @return 执行成功的应答结果对象
     */
    public static <T extends Serializable> ResponseMessage<T> genSuccessResult() {
        return new ResponseMessage<>(CommonResponseCode.SUCCESS, null, null);
    }
    
    /**
     * <pre>
     * 构造执行成功的应答消息（包含附加数据对象）
     * 消息格式：
     * 
     * {
     *     "code" : 0,
     *     "msg" : null,
     *     "data" : {
     *         "field1" : "value1",
     *         "field2" : "value2"
     *     }
     * }
     * 
     * 或者：
     * 
     * {
     *     "code" : 0,
     *     "msg" : null,
     *     "data" : [
     *         {
     *             "field1" : "value1",
     *             "field2" : "value2"
     *         }
     *     ]
     * }
     * </pre>
     * 
     * @param data 附加数据对象
     * @return 执行成功的应答结果对象
     */
    public static <T extends Serializable> ResponseMessage<T> genSuccessResult(T data) {
        return new ResponseMessage<>(CommonResponseCode.SUCCESS, null, data);
    }
    
    /**
     * <pre>
     * 构造执行失败的应答消息（不包含附加数据对象）
     * 消息格式：
     * 
     * {
     *     "code" : 1,
     *     "msg" : "执行失败",
     *     "data" : null
     * }
     * </pre>
     * 
     * @return 执行失败的应答结果对象
     */
    public static <T extends Serializable> ResponseMessage<T> genFailResult() {
        return new ResponseMessage<>(CommonResponseCode.FAIL, CommonResponseCode.DFT_MSG_FAIL, null);
    }
    
    /**
     * <pre>
     * 构造执行失败的应答消息（请求的服务/资源不存在）
     * 消息格式：
     * 
     * {
     *     "code" : 100,
     *     "msg" : "请求的服务或资源不存在",
     *     "data" : null
     * }
     * </pre>
     * 
     * @return 执行失败的应答结果对象
     */
    public static <T extends Serializable> ResponseMessage<T> genResourceNotFoundResult() {
        return genResult(CommonResponseCode.RESOUSE_NOT_FOUND, CommonResponseCode.DFT_MSG_RESOUSE_NOT_FOUND);
    }
    
    /**
     * <pre>
     * 未查询到数据
     * 消息格式：
     * 
     * {
     *     "code" : 110,
     *     "msg" : "未查询到数据(或${msg})",
     *     "data" : null
     * }
     * 
     * 版本修改历史记录：
     * 1) 1.0.0 2018-11-22 17:42:56 FengChangshuo 初始创建
     * </pre>
     * 
     * @param msg
     * @return
     */
    public static <T extends Serializable> ResponseMessage<T> genDataNotFoundResult(String msg) {
        if (msg == null || "".equals(msg)) {
            return genResult(CommonResponseCode.DATA_NOT_FOUND, CommonResponseCode.DFT_MSG_DATA_NOT_FOUND);
        }
        
        return genResult(CommonResponseCode.DATA_NOT_FOUND, msg);
    }
    
    /**
     * <pre>
     * 构造执行失败的应答消息（数据格式错误，无法正确解析）
     * 消息格式：
     * 
     * {
     *     "code" : 200,
     *     "msg" : "数据格式错误，无法正确解析",
     *     "data" : null
     * }
     * </pre>
     * 
     * @return 执行失败的应答结果对象
     */
    public static <T extends Serializable> ResponseMessage<T> genErrorDataFormatterResult() {
        return genResult(CommonResponseCode.ERROR_DATA_FORMATTE, CommonResponseCode.DFT_MSG_ERROR_DATA_FORMATTE);
    }
    
    /**
     * <pre>
     * 构造执行失败的应答消息（表单验证失败）
     * 消息格式：
     * 
     * {
     *     "code" : 210,
     *     "msg" : "表单数据验证失败",
     *     "data" : {some object}
     * }
     * </pre>
     * 
     * @param errMsg 错误提示信息
     * @return 执行失败的应答结果对象
     */
    public static <T extends Serializable> ResponseMessage<T> genErrorDataValidateResult(T errData) {
        return new ResponseMessage<>(CommonResponseCode.ERROR_DATA_VALIDATE,
                CommonResponseCode.DFT_MSG_ERROR_DATA_VALIDATE, errData);
    }
    
    /**
     * <pre>
     * 构造执行失败的应答消息（权限不足）
     * 消息格式：
     * 
     * {
     *     "code" : 300,
     *     "msg" : "权限不足",
     *     "data" : null
     * }
     * </pre>
     * 
     * @return 执行失败的应答结果对象
     */
    public static <T extends Serializable> ResponseMessage<T> genNoPermissionResult() {
        return genResult(CommonResponseCode.NO_PERMISSION, CommonResponseCode.DFT_MSG_NO_PERMISSION);
    }
    
    /**
     * <pre>
     * 构造执行失败的应答消息（未登录或登录超时）
     * 消息格式：
     * 
     * {
     *     "code" : 310,
     *     "msg" : "未登录或登录超时",
     *     "data" : null
     * }
     * </pre>
     * 
     * @return 执行失败的应答结果对象
     */
    public static <T extends Serializable> ResponseMessage<T> genLoginTimeoutResult() {
        return genResult(CommonResponseCode.LOGIN_TIMEOUT, CommonResponseCode.DFT_MSG_LOGIN_TIMEOUT);
    }
    
    /**
     * <pre>
     * 构造执行失败的应答消息（不包含附加数据对象）
     * 消息格式：
     * 
     * {
     *     "code" : 1,
     *     "msg" : "${errMsg}",
     *     "data" : null
     * }
     * </pre>
     * 
     * @param errMsg 错误提示信息
     * @return 执行失败的应答结果对象
     */
    public static <T extends Serializable> ResponseMessage<T> genFailResult(String errMsg) {
        return new ResponseMessage<>(CommonResponseCode.FAIL, errMsg, null);
    }
    
    /**
     * 构造应答消息
     * 
     * @param code 应答结果编码
     * @param msg 提示信息
     * @return 应答结果对象
     */
    public static <T extends Serializable> ResponseMessage<T> genResult(int code, String msg) {
        return new ResponseMessage<>(code, msg, null);
    }
    
}
